]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
dnd: Don't try to restore to parent location if parent got destroyed
authorSebastian Keller <skeller@gnome.org>
Sat, 17 Apr 2021 17:53:43 +0000 (19:53 +0200)
committerMarge Bot <marge-bot@gnome.org>
Thu, 29 Apr 2021 18:25:56 +0000 (18:25 +0000)
The original parent of a dragged actor might have been destroyed after
the drag has been started. When the drag is canceled and _dragOrigParent
is set, the code is trying to get the current position and size of it
when restoring. With a destroyed parent this however would result in a
crash.

This could happen for example when starting a drag on a window preview
while the overview is hiding and then releasing it once the transition
is done.

Fixes https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/4024

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1817>

js/ui/dnd.js

index 0af1e7ecc7bf76d048669eccebba9dbf9e2dc737..03b56915f160615b4773b518dbc42743ddf7297e 100644 (file)
@@ -407,6 +407,10 @@ var _Draggable = class _Draggable {
             Main.uiGroup.add_child(this._dragActor);
             Main.uiGroup.set_child_above_sibling(this._dragActor, null);
             Shell.util_set_hidden_from_pick(this._dragActor, true);
+
+            this._dragOrigParentDestroyId = this._dragOrigParent.connect('destroy', () => {
+                this._dragOrigParent = null;
+            });
         }
 
         this._dragActorDestroyId = this._dragActor.connect('destroy', () => {
@@ -776,6 +780,11 @@ var _Draggable = class _Draggable {
             this._dragActor = null;
         }
 
+        if (this._dragOrigParent) {
+            this._dragOrigParent.disconnect(this._dragOrigParentDestroyId);
+            this._dragOrigParent = null;
+        }
+
         this._dragState = DragState.INIT;
         currentDraggable = null;
     }